/**
 * 
 */
package tools;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

public class Statistic {

	/** pour chaque type, la liste des twitts qui lui correspondent (apprentissage) */
	HashMap<String, ArrayList<String>> corpus;
	HashMap<String, Integer> frequenceMot;

	/** le nombre de mots au total */
	private int nbMotTotal;
	/** le nombre de mots différents */
	private int nbMotDifferent;
	/** le nombre de total de twitts */
	private int nbTwitt;
	/** le nombre moyen de mots dans chaque message */
	private double moyenneMessages;

	/**
	 * construit les statistiques a partir du corpus
	 */
	public Statistic(HashMap<String, ArrayList<String>> corpus) {
		this.corpus = corpus;
		frequenceMot = new HashMap<String, Integer>();
		nbMotTotal = calculNbMotTotal();
		nbMotDifferent = calculNbMotDifferent();
		nbTwitt = calculNbTwitt();
		moyenneMessages = calculMoyenneMessage();

		System.out.println("Nombre de mots total : " + nbMotTotal);
		System.out.println("Nombre de mots differents : " + nbMotDifferent);
		System.out.println("Nombre de twitt : " + nbTwitt);
		System.out
				.println("Longueur moyenne des messages : " + moyenneMessages);

	}

	/**
	 * @return le nombre total de twitts
	 */
	private int calculNbTwitt() {
		int size = 0;
		for (Entry<String, ArrayList<String>> twitt : corpus.entrySet()) {
			size += twitt.getValue().size();
		}
		return size;
	}

	/**
	 * @return le nombre moyen de mots dans un twitt
	 */
	private float calculMoyenneMessage() {
		if (nbTwitt < 1)
			return 0;
		return nbMotTotal / nbTwitt;
	}

	/**
	 * @return le nombre de mots differents
	 */
	private int calculNbMotDifferent() {
		String[] contenu;
		for (Entry<String, ArrayList<String>> twitt : corpus.entrySet()) {
			for (int i = 0; i < twitt.getValue().size(); i++) {
				contenu = twitt.getValue().get(i).split(" ");
				for (int j = 0; j < contenu.length; j++) {
					if (frequenceMot.containsKey(contenu[j])) {
						frequenceMot.put(contenu[j],
								frequenceMot.get(contenu[j]) + 1);
					} else {
						frequenceMot.put(contenu[j], 1);
					}
				}
			}
		}
		return frequenceMot.size();
	}

	/**
	 * @return le nombre de mots total
	 */
	private int calculNbMotTotal() {
		int nbMots = 0;
		String[] contenu;
		for (Entry<String, ArrayList<String>> twitt : corpus.entrySet()) {
			for (int i = 0; i < twitt.getValue().size(); i++) {
				contenu = twitt.getValue().get(i).split(" ");
				nbMots += contenu.length;
			}
		}
		return nbMots;
	}

	public int getNbMotTotal() {
		return nbMotTotal;
	}

	public int getNbMotDifferent() {
		return nbMotDifferent;
	}

	public int getNbTwitt() {
		return nbTwitt;
	}

	public double getMoyenneMessages() {
		return moyenneMessages;
	}

	/**
	 * 
	 * @return les 20 premiers mots les plus frequents
	 */
	public HashMap<String, Integer> getMostFrequents() {
		final int size = 20;
		String[] mots = new String[size], keys = new String[0];
		int[] valeurs = new int[size];
		keys = frequenceMot.keySet().toArray(keys);

		for (int i = 0; i < size; i++) {
			mots[i] = keys[i];
			valeurs[i] = frequenceMot.get(keys[i]);
		}
		int j;
		for (int i = size; i < keys.length; i++) {
			j = 0;
			while (j < size && valeurs[j] > frequenceMot.get(keys[i]))
				j++;
			if (j < size) {
				mots[j] = keys[i];
				valeurs[j] = frequenceMot.get(keys[i]);
			}
		}

		HashMap<String, Integer> ret = new HashMap<String, Integer>(size);
		System.out.println("\nMots les plus frequents :");
		for (int i = 0; i < size; i++) {
			ret.put(mots[i], valeurs[i]);
			System.out.println(mots[i] + " : " + valeurs[i]);
		}

		return ret;
	}
	
	/***
	 * 
	 * @return les 20 mots els moins frequents
	 */
	public HashMap<String, Integer> getLeastFrequents() {
		final int size = 20;
		String[] mots = new String[size], keys = new String[0];
		int[] valeurs = new int[size];
		keys = frequenceMot.keySet().toArray(keys);

		for (int i = 0; i < size; i++) {
			mots[i] = keys[i];
			valeurs[i] = frequenceMot.get(keys[i]);
		}
		int j;
		for (int i = size; i < keys.length; i++) {
			j = 0;
			while (j < size && valeurs[j] < frequenceMot.get(keys[i]))
				j++;
			if (j < size) {
				mots[j] = keys[i];
				valeurs[j] = frequenceMot.get(keys[i]);
			}
		}

		HashMap<String, Integer> ret = new HashMap<String, Integer>(size);
		System.out.println("\nMots les moins frequents :");
		for (int i = 0; i < size; i++) {
			ret.put(mots[i], valeurs[i]);
			System.out.println(mots[i] + " : " + valeurs[i]);
		}

		return ret;
	}
}
